package cn.bgw._76;

import java.util.WeakHashMap;

public class WeakHashMapDemo {

    public static void main(String[] args) {
        myWeakHashMap();
    }

    public static void myWeakHashMap(){
        WeakHashMap<String, Object> weakHashMap = new WeakHashMap();
        /**
         * 注意这里有个小细节，就是key使用了new String() 生成，
         * 而非直接使用key的字符串常量。为什么呢？
         * 这是因为对于可在编译阶段确定的字符串，系统的字符串常量池会直接记录它，
         * 自动保留对它的强引用。此情况下，GC无法从WeakHashMap中删除这个Key。
         * 而使用new String生成的字符串对象无法在编译阶段中确定，
         * 需要在运行时生成此字符串。而且其存储位置是堆，而非字符串常量池。
         * 这样，我们通过new String()这种方式避免了对字符串“key”施加强引用。
         */
        String key = new String("key");
        String value = "value";

        weakHashMap.put(key, value);
        System.out.println(weakHashMap);

        key = null;
        System.out.println(weakHashMap);

        System.gc();
        System.out.println(weakHashMap +"\t"+weakHashMap.size());
    }
}
